// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../SQLStatementImpl.h"
#include "../SQLIndex.h"
#include "SQLCreateStatement.h"

class SQLCreateIndexStatement : virtual public SQLStatementImpl, virtual public SQLCreateStatement, virtual public SQLIndex
{
public:
  SQLIndexDefinition_ptr indexDefinition;

  BOOL_ptr concurrently;      // for pg
  SQLName_ptr tablespace; // for oracle
  BOOL_ptr deferedRebuild;
  SQLTableSource_ptr in;
  SQLExternalRecordFormat_ptr rowFormat;
  SQLName_ptr storedAs;
  SQLAssignItem_list_ptr properties;
  SQLAssignItem_list_ptr tableProperties;
  BOOL_ptr storing;
  BOOL_ptr ifNotExists;

  SQLCreateIndexStatement();

  SQLCreateIndexStatement(DbType_ptr dbType);
  SHAREDOBJECT(SQLCreateIndexStatement);

  SQLIndexDefinition_ptr getIndexDefinition();

  SQLTableSource_ptr getTable();

  void setTable(SQLName_ptr table);

  void setTable(SQLTableSource_ptr table);

  string_ptr getTableName();

  SQLSelectOrderByItem_list_ptr getItems();

  void addItem(SQLSelectOrderByItem_ptr item);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  string_ptr getType();

  void setType(string_ptr type);

  string_ptr getUsing();

  void setUsing(string_ptr using_);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  // @Override
  SQLObject_list_ptr getChildren();

  string_ptr getSchema();

  SQLObject_ptr clone();

  SQLExpr_ptr getComment();

  void setComment(SQLExpr_ptr x);

  SQLName_ptr getTablespace();

  void setTablespace(SQLName_ptr x);

  BOOL_ptr isConcurrently();

  void setConcurrently(BOOL_ptr concurrently);

  SQLAssignItem_list_ptr getOptions();

  BOOL_ptr isDeferedRebuild();

  void setDeferedRebuild(BOOL_ptr deferedRebuild);

  SQLTableSource_ptr getIn();

  void setIn(SQLName_ptr x);

  void setIn(SQLTableSource_ptr x);

  SQLName_ptr getStoredAs();

  void setStoredAs(SQLName_ptr x);

  SQLExternalRecordFormat_ptr getRowFormat();

  void setRowFormat(SQLExternalRecordFormat_ptr x);

  SQLAssignItem_list_ptr getProperties();

  SQLAssignItem_list_ptr getTableProperties();

  void addOption(string_ptr name, SQLExpr_ptr value);

  BOOL_ptr isGlobal();

  void setGlobal(BOOL_ptr global);

  BOOL_ptr isLocal();

  void setLocal(BOOL_ptr local);

  SQLExpr_ptr getDbPartitionBy();

  void setDbPartitionBy(SQLExpr_ptr x);

  SQLExpr_ptr getTablePartitions();

  void setTablePartitions(SQLExpr_ptr x);

  SQLExpr_ptr getTablePartitionBy();

  void setTablePartitionBy(SQLExpr_ptr x);

  BOOL_ptr isStoring();

  void setStoring(BOOL_ptr storing);

  // @Override
  SQLName_list_ptr getCovering();

  // @Override
  SQLSelectOrderByItem_list_ptr getColumns();

  BOOL_ptr isIfNotExists();

  void setIfNotExists(BOOL_ptr ifNotExists);

  // @Override
  SQLDDLStatement::DDLObjectType getDDLObjectType();
};
